package com.xia.netty.thread.volatileExp;
public class VolatileTest {
    volatile int a = 1;
    volatile int b = 2;

    public  void change(){
        a = 3;
        b = a;
    }
    public   void print(){
        /**
         * 可能出现的情况:  a+"----"+b 非原子操作,并发下可能会产生线程安全问题
         *      预期结果: a=1 b=2 / a=b=3
         *      实际结果: a=1 b=2 / a=b=3 /a=1 b=3 /a=3 b=2
         *      a=1 b=3 --> 线程1执行print方法,当读取到a的值后被挂起,线程2执行完exchange方法后,线程1继续执行
         *      a=3 b=2 --> 线程1执行exchange方法,当a的值改变后,线程被挂起,线程2执行print方法
         *
         *      当保证exchange和print内部逻辑是原子操作后可以达到预期结果
         */
       // System.out.println("b="+b+";a="+a);
        System.out.println(a+"----"+b);

    }

    public static void main(String[] args) {
        while (true){
            final VolatileTest test = new VolatileTest();
            new Thread(()->{
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                test.change();
            }).start();
            new Thread(()->{
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                test.print();
            }).start();
        }
    }
}